/*******************************************************************************
** 文件名称：gm_pm.h
** 文件作用：通用页面管理
** 编写作者：Tom Free 付瑞彪
** 编写时间：2020-07-02
** 文件备注：负责管理页面，处理页面事件和页面切换的初始化以及后处理
**			 
**			 
** 更新记录：
**          2020-07-02 -> 创建文件                          <Tom Free 付瑞彪>
**
**              Copyright (c) 2018-2020 付瑞彪 All Rights Reserved
**
**       1 Tab == 4 Spaces     UTF-8     ANSI C Language(C99)
*******************************************************************************/
#ifndef __GM_PM_H__
#define __GM_PM_H__

#include "stdint.h"

/* 页面管理结果 */
typedef enum
{
    GM_PM_RESULT_INVALID_PARAM = -2,    /* 非法参数 */
    GM_PM_RESULT_ERROR = -1,            /* 错误 */
    GM_PM_RESULT_SUCCESS = 0,           /* 正常 */
} GM_PM_RESULT;

/* 事件定义 */
typedef struct
{
    uint32_t type;  /* 事件类型 */
    uint32_t id;    /* 事件ID */
    uint32_t param; /* 短参数，用于简单参数传递 */
    void* pmsg;     /* 长参数，用于复杂参数传递 */
} GM_PM_EVENT;

/* 页面定义 */
typedef struct GM_PAGE
{
    GM_PM_RESULT(*Init)(void);                          /* 初始化 */
    GM_PM_RESULT(*Load)(void);                          /* 启动加载 */
    GM_PM_RESULT(*Exec)(const GM_PM_EVENT* pEvent);     /* 事件执行处理 */
    struct GM_PAGE* Previous;                           /* 前一个页面 */
} GM_PAGE;

/* 页面管理器 */
typedef struct
{
    size_t      page_num;      /* 总页面个数 */
    GM_PAGE**   page_ptr_arr;  /* 页面指针列表起始地址 */
    GM_PAGE*    cur_page;      /* 当前页面 */
} GM_PM;

#ifdef __cplusplus
extern "C" {
#endif

/*******************************************************************************
** 函数名称：GM_PM_Init
** 函数作用：初始化页面管理
** 输入参数：pm - 页面管理器指针
** 输出参数：处理结果
** 使用范例：GM_PM_Init();
** 函数备注：
*******************************************************************************/
GM_PM_RESULT GM_PM_Init(GM_PM* pm);

/*******************************************************************************
** 函数名称：GM_PM_Start
** 函数作用：启动页面管理
** 输入参数：pm - 页面管理器指针
** 输出参数：启动结果
** 使用样例：GM_PM_Start(&pm);
** 函数备注：
*******************************************************************************/
GM_PM_RESULT GM_PM_Start(GM_PM* pm);

/*******************************************************************************
** 函数名称：GM_PM_Exec
** 函数作用：执行页面管理，处理事件
** 输入参数：pm - 页面管理器指针
**           pEvent - 事件指针
** 输出参数：处理结果
** 使用样例：GM_PM_Exec(&pm, &event);
** 函数备注：
*******************************************************************************/
GM_PM_RESULT GM_PM_Exec(GM_PM* pm, GM_PM_EVENT* pEvent);

/*******************************************************************************
** 函数名称：GM_PM_Enter
** 函数作用：进入一个页面
** 输入参数：无
** 输出参数：处理结果
** 使用范例：GM_PM_Enter();
** 函数备注：此处的切换必须保证不要重入，否则会出意外
*******************************************************************************/
GM_PM_RESULT GM_PM_Enter(GM_PM* pm, GM_PAGE* page);

/*******************************************************************************
** 函数名称：GM_PM_Exit
** 函数作用：退出当前页面，自动返回到历史的上一个页面
** 输入参数：pm - 页面管理器指针
** 输出参数：处理结果
** 使用范例：GM_PM_Exit(&pm);
** 函数备注：
*******************************************************************************/
GM_PM_RESULT GM_PM_Exit(GM_PM* pm);

#ifdef __cplusplus
}
#endif

#endif	/* __GM_PM_H__ */
